﻿namespace wwl.Domain.Entities.Common
{
  /// <summary>
  /// 领域实体的通用基类，封装所有实体的公共属性和基础行为
  /// 所有领域实体（如租户、用户、角色等）必须继承此类，确保实体模型的一致性
  /// </summary>
  public abstract class BaseEntity
  {
    /// <summary>
    /// 实体唯一标识（主键）
    /// </summary>
    /// <remarks>
    /// 1. 采用字符串类型，兼容 GUID、雪花ID等多种ID生成策略
    /// 2. 默认为新生成的 GUID 字符串（自动初始化）
    /// 3.  setter 设为 internal，避免外部随意修改主键（仅允许实体内部或继承类调整），允许在测试中设置特定 ID
    /// </remarks>
    public string Id { get; internal set; } = Guid.NewGuid().ToString();

    /// <summary>
    /// 实体创建时间（UTC 时间）
    /// </summary>
    /// <remarks>
    /// 1. 默认为当前 UTC 时间，确保跨时区系统的时间一致性
    /// 2. 通常在实体创建时自动赋值，后续不修改（业务特殊需求除外）
    /// </remarks>
    public DateTime CreatedTime { get; set; } = DateTime.UtcNow;

    /// <summary>
    /// 实体最后更新时间（UTC 时间）
    /// </summary>
    /// <remarks>
    /// 1. 默认为当前 UTC 时间，与创建时间初始值一致
    /// 2. 应在实体更新操作时自动更新为当前 UTC 时间（建议通过仓储或拦截器实现）
    /// </remarks>
    public DateTime UpdatedTime { get; set; } = DateTime.UtcNow;

    /// <summary>
    /// 实体创建人标识（如用户ID）
    /// </summary>
    /// <remarks>
    /// 1. 默认为空字符串，避免 null 引用
    /// 2. 应在实体创建时记录操作人ID，用于审计追踪
    /// </remarks>
    public string CreatedBy { get; set; } = string.Empty;

    /// <summary>
    /// 实体备注信息
    /// </summary>
    /// <remarks>
    /// 1. 用于存储实体的附加说明、备注文本（非必填）
    /// 2. 默认为空字符串，避免 null 引用
    /// </remarks>
    public string Remarks { get; set; } = string.Empty;

    /// <summary>
    /// 逻辑删除标记
    /// </summary>
    /// <remarks>
    /// 1. true 表示实体已逻辑删除（软删除），false 表示正常
    /// 2. 配合仓储的软删除功能使用，查询时默认过滤已删除实体（IsDeleted = false）
    /// 3. 默认为 false（实体创建时为未删除状态）
    /// </remarks>
    public bool IsDeleted { get; set; } = false;
  }
}